/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufjf.posjava.cm.model.DAO;

import br.ufjf.posjava.cm.model.Agenda;
import br.ufjf.posjava.cm.model.Paciente;
import br.ufjf.posjava.cm.model.Profissional;
import br.ufjf.posjava.cm.util.GenericDao;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

/**
 *
 * @author Fabíola
 */
public class AgendaDAO extends GenericDao<Agenda, Integer> {

    @Override
    public void inserir(Agenda obj) throws ClassNotFoundException, SQLException {
        String sql = "INSERT INTO agenda (data,id_paciente,id_dentista,id_atendente,status) VALUES (?,?,?,?,?)";

        ArrayList<String> lista = new ArrayList<String>();

        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        lista.add(dateFormat.format(obj.getData()));
        lista.add(obj.getPaciente().getIdPaciente().toString());
        lista.add(obj.getDentista().getIdProfissional().toString());
        lista.add(obj.getAtendente().getIdProfissional().toString());
        lista.add(obj.getStatus());

        executaDML(sql, lista);
    }

    @Override
    public void alterar(Agenda obj) throws ClassNotFoundException, SQLException {
        String sql = "UPDATE agenda SET data = ?, id_paciente = ?, id_dentista = ?, "
                + "id_atendente = ?, status = ? where id = ?";

        ArrayList<String> lista = new ArrayList<String>();
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");

        lista.add(dateFormat.format(obj.getData()));
        lista.add(obj.getPaciente().getIdPaciente().toString());
        lista.add(obj.getDentista().getIdProfissional().toString());
        lista.add(obj.getAtendente().getIdProfissional().toString());
        lista.add(obj.getStatus());
        lista.add(obj.getIdAgenda().toString());

        executaDML(sql, lista);
    }

    @Override
    public void apagar(Agenda obj) throws ClassNotFoundException, SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public Agenda pesquisarChave(Integer obj) throws ClassNotFoundException, SQLException {
        String sql = "SELECT * FROM agenda WHERE id = ?";
        ArrayList<String> lista = new ArrayList<String>();
        lista.add(obj.toString());

        ResultSet rs = executaSql(sql, lista);
        if (rs.next()) {

            Agenda agenda = new Agenda(rs.getInt("id"), new Date(rs.getTimestamp("data").getTime()), new Paciente(rs.getInt("id_paciente")),
                    new Profissional(rs.getInt("id_dentista")), new Profissional(rs.getInt("id_atendente")),
                    rs.getString("status"));
            return agenda;
        } else {
            return null;
        }
    }

    @Override
    public ArrayList<Agenda> buscarTodos() throws ClassNotFoundException, SQLException {
        Paciente paciente;
        Profissional dentista;
        Profissional atendente;
        String sql = "SELECT * FROM agenda WHERE status = 'agendada' order by data";
        ArrayList<String> lista = new ArrayList<String>();
        ArrayList<Agenda> listaA = new ArrayList<Agenda>();
        ResultSet rs = executaSql(sql, lista);

        while (rs.next()) {
            Agenda a = new Agenda();
            a.setIdAgenda(rs.getInt("id"));

            a.setData(new Date(rs.getTimestamp("data").getTime()));

            paciente = new Paciente();
            paciente.setIdPaciente(rs.getInt("id_paciente"));

            dentista = new Profissional();
            dentista.setIdProfissional(rs.getInt("id_dentista"));

            atendente = new Profissional();
            atendente.setIdProfissional(rs.getInt("id_atendente"));

            a.setStatus(rs.getString("status"));

            a.setPaciente(paciente);
            a.setDentista(dentista);
            a.setAtendente(atendente);

            listaA.add(a);

        }
        return listaA;
    }
    
    public ArrayList<Agenda> buscarAgendaPeloNomePaciente(String nome) throws ClassNotFoundException, SQLException {
        String sql = "SELECT a.id, a.data, a.id_paciente, a.id_dentista, a.id_atendente, a.status "
                + "FROM agenda a, paciente p "
                + "WHERE a.status = 'agendada'"
                + "AND a.id_paciente = p.id "
                + "AND p.nome LIKE '%" + nome + "%'order by data";

        Paciente paciente;
        Profissional dentista;
        Profissional atendente;
        ArrayList<String> lista = new ArrayList<String>();
        ArrayList<Agenda> listaAgendas = new ArrayList<Agenda>();
        ResultSet rs = executaSql(sql, lista);

        while (rs.next()) {
            Agenda a = new Agenda();
            a.setIdAgenda(rs.getInt("a.id"));

            a.setData(new Date(rs.getTimestamp("a.data").getTime()));

            paciente = new Paciente();
            paciente.setIdPaciente(rs.getInt("a.id_paciente"));

            dentista = new Profissional();
            dentista.setIdProfissional(rs.getInt("a.id_dentista"));

            atendente = new Profissional();
            atendente.setIdProfissional(rs.getInt("a.id_atendente"));

            a.setStatus(rs.getString("a.status"));

            a.setPaciente(paciente);
            a.setDentista(dentista);
            a.setAtendente(atendente);

            listaAgendas.add(a);

        }
        return listaAgendas;
    }
    
    public ArrayList<Agenda> buscarAgendaPeloNomeDentista(String nome) throws ClassNotFoundException, SQLException {
        String sql = "SELECT a.id, a.data, a.id_paciente, a.id_dentista, a.id_atendente, a.status "
                + "FROM agenda a, profissional p "
                + "WHERE a.status = 'agendada'"
                + "AND a.id_dentista = p.id "
                + "AND p.nome LIKE '%" + nome + "%'order by data";

        Paciente paciente;
        Profissional dentista;
        Profissional atendente;
        ArrayList<String> lista = new ArrayList<String>();
        ArrayList<Agenda> listaAgendas = new ArrayList<Agenda>();
        ResultSet rs = executaSql(sql, lista);

        while (rs.next()) {
            Agenda a = new Agenda();
            a.setIdAgenda(rs.getInt("a.id"));

            a.setData(new Date(rs.getTimestamp("a.data").getTime()));

            paciente = new Paciente();
            paciente.setIdPaciente(rs.getInt("a.id_paciente"));

            dentista = new Profissional();
            dentista.setIdProfissional(rs.getInt("a.id_dentista"));

            atendente = new Profissional();
            atendente.setIdProfissional(rs.getInt("a.id_atendente"));

            a.setStatus(rs.getString("a.status"));

            a.setPaciente(paciente);
            a.setDentista(dentista);
            a.setAtendente(atendente);

            listaAgendas.add(a);

        }
        return listaAgendas;
    }

    public void alterarStatusDeAgenda(Integer idAgenda) throws ClassNotFoundException, SQLException {
        String sql = "UPDATE agenda SET status = ? where id = " + idAgenda + "";

        Agenda agenda = new Agenda();
        ArrayList<String> lista = new ArrayList<String>();

        agenda.setStatus("cancelada");
        lista.add(agenda.getStatus());

        executaDML(sql, lista);
    }
    
    public ArrayList<Agenda> buscarAgendaPelaData(Date data) throws ClassNotFoundException, SQLException  {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        String dataStr = dateFormat.format(data);
                
        String sql = "SELECT a.id, a.data, a.id_paciente, a.id_dentista, a.id_atendente, a.status FROM agenda a, paciente p "
                + "WHERE a.status = 'agendada'"
                + "AND a.id_paciente = p.id "              
                + "AND a.data BETWEEN '"+dataStr+" "+"00:00:00"+"' "
                + "AND '"+dataStr+" "+"23:59:59"+"' order by data";
        Paciente paciente;
        Profissional dentista;
        Profissional atendente;
        ArrayList<String> lista = new ArrayList<String>();
        ArrayList<Agenda> listaP = new ArrayList<Agenda>();
        ResultSet rs = executaSql(sql, lista);

        while (rs.next()) {
            Agenda a = new Agenda();
            a.setIdAgenda(rs.getInt("a.id"));

            a.setData(new Date(rs.getTimestamp("a.data").getTime()));

            paciente = new Paciente();
            paciente.setIdPaciente(rs.getInt("a.id_paciente"));

            dentista = new Profissional();
            dentista.setIdProfissional(rs.getInt("a.id_dentista"));

            atendente = new Profissional();
            atendente.setIdProfissional(rs.getInt("a.id_atendente"));

            a.setStatus(rs.getString("a.status"));

            a.setPaciente(paciente);
            a.setDentista(dentista);
            a.setAtendente(atendente);

            listaP.add(a);

        }
        return listaP;
    }
    
    
}